In [1]:
    
%load_ext autoreload
%autoreload 2
import os
import tqdm
from skimage.external import tifffile as tif
%pylab inline
from psfotf import *
from dphutils import scale
from dphplotting import mip, slice_plot, display_grid
import time
    
    
In [2]:
    
test_data = tif.imread("../fixtures/BIL113_zstack_z300nm_current.tif")
params = dict(
    size = test_data.shape[-1],
    zsize = test_data.shape[0],
    na = 1.1,
    res = 90.5,
    zres = 300,
    wl = 605,
    ni = 1.33,
    vec_corr="none",
    condition="none"
)
    
    
In [3]:
    
mip(test_data)
    
    Out[3]:
    
In [4]:
    
psf = HanserPSF(**params)
    
In [5]:
    
mip(psf.PSFi)
    
    Out[5]:
    
In [6]:
    
def retrieve_phase(mag, psf, pupil=None):
    """This function acurately reproduces the matlab code"""
    if pupil is None:
        # if first iteration, start with pupil of 1 over pass band
        pupil = psf._gen_pupil()
    psf._gen_psf(pupil)
    phase = angle(psf.PSFa.squeeze())
    #replace magnitude with sqrt of PSF
    new_psf = mag * exp(1j * phase)
    new_pupils = fftn(ifftshift(new_psf, axes=(1,2)), axes=(1,2))
    # undo focus
    new_pupil = (new_pupils / psf._calc_defocus()).mean(0)
    # save only the phase information, magnitude will be restricted to 1
    new_pupil = exp(1j * angle(new_pupil))
    return psf._gen_pupil() * new_pupil, new_pupils
    
In [7]:
    
start = time.time()
npix = 257
PSF_measured = test_data.copy()
nz, ny, nx = PSF_measured.shape;
zc, yc, xc = unravel_index(PSF_measured.argmax(), PSF_measured.shape);
PSF_offset = 1.5 * bincount(PSF_measured.ravel()).argmax()
PSF = zeros((nz, npix, npix))
PSF[:, npix // 2 - yc:npix // 2 + ny - yc, npix // 2-xc:npix // 2 + nx - xc] = PSF_measured
PSF = sqrt(PSF)
PSF = PSF - sqrt(PSF_offset)
PSF *= PSF > 0
params.update(dict(size = npix))
psf = HanserPSF(**params)
pupil = None
psf._gen_kr()
for _ in range(25):
    pupil, pupils = retrieve_phase(PSF, psf, pupil, True)
fig, axs = subplots(1, 2, figsize = (12, 6))
img1 = axs[0].matshow(fftshift(angle(conj(pupil)) * psf._gen_pupil().real), cmap="jet_r")
colorbar(img1, ax=axs[0])
img2 = axs[1].matshow(fftshift(abs(pupil)))
colorbar(img2, ax=axs[1])
print(time.time()-start)
    
    
    
In [8]:
    
mip(PSF)
    
    Out[8]:
    
In [9]:
    
display_grid({z:fftshift(abs(pupil) * psf._gen_pupil().real) for z, pupil in zip(psf.zrange, pupils / psf._calc_defocus())});
    
    
In [10]:
    
display_grid({z:fftshift(angle(pupil) * psf._gen_pupil().real) for z, pupil in zip(psf.zrange, pupils)});
    
    
In [11]:
    
display_grid({z:fftshift(angle(pupil) * psf._gen_pupil().real) for z, pupil in zip(psf.zrange, pupils/psf._calc_defocus())});
    
    
In [12]:
    
display_grid({z:p for z, p in zip(psf.zrange, PSF)});
    
    
The problem is that this data set gets clipped too much when removing background.
In [ ]: